#!/bin/bash

# Ubuntu开发环境一键安装脚本
# 版本：v1.0
# 日期：2024-11-04
# 适用：Ubuntu 22.04 LTS

set -e  # 遇到错误立即退出

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 打印函数
print_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

print_step() {
    echo ""
    echo -e "${GREEN}========================================${NC}"
    echo -e "${GREEN}  $1${NC}"
    echo -e "${GREEN}========================================${NC}"
}

# 检查是否为root或有sudo权限
check_sudo() {
    if [ "$EUID" -eq 0 ]; then 
        print_warning "正在以root用户运行"
        SUDO=""
    else
        if ! command -v sudo &> /dev/null; then
            print_error "sudo命令不存在，请先安装sudo或以root用户运行"
            exit 1
        fi
        SUDO="sudo"
    fi
}

# 检查Ubuntu版本
check_ubuntu_version() {
    if [ ! -f /etc/os-release ]; then
        print_error "无法检测系统版本"
        exit 1
    fi
    
    source /etc/os-release
    print_info "检测到系统：$NAME $VERSION"
    
    if [[ "$ID" != "ubuntu" ]]; then
        print_warning "此脚本针对Ubuntu设计，当前系统：$ID"
        read -p "是否继续？(y/n): " -n 1 -r
        echo
        if [[ ! $REPLY =~ ^[Yy]$ ]]; then
            exit 1
        fi
    fi
}

# 更新软件包列表
update_package_list() {
    print_step "步骤1/7: 更新软件包列表"
    print_info "执行 apt update..."
    $SUDO apt update
    print_info "软件包列表更新完成"
}

# 安装基础开发工具
install_basic_tools() {
    print_step "步骤2/7: 安装基础开发工具"
    
    BASIC_PACKAGES=(
        build-essential
        gcc
        g++
        make
        cmake
        autoconf
        automake
        pkg-config
        git
        vim
        curl
        wget
        htop
        tree
        net-tools
        tmux
        unzip
        zip
        gdb
        strace
        lsof
        ncdu
        jq
    )
    
    print_info "将安装以下工具："
    printf '%s\n' "${BASIC_PACKAGES[@]}"
    echo ""
    
    $SUDO apt install -y "${BASIC_PACKAGES[@]}"
    
    print_info "基础工具安装完成"
    
    # 显示版本
    echo ""
    print_info "工具版本信息："
    echo "  GCC: $(gcc --version | head -n 1)"
    echo "  G++: $(g++ --version | head -n 1)"
    echo "  Make: $(make --version | head -n 1)"
    echo "  CMake: $(cmake --version | head -n 1)"
    echo "  Git: $(git --version)"
}

# 配置vim
configure_vim() {
    print_step "步骤3/7: 配置Vim"
    
    if [ -f ~/.vimrc ]; then
        print_warning "~/.vimrc 已存在，备份为 ~/.vimrc.bak"
        cp ~/.vimrc ~/.vimrc.bak
    fi
    
    cat > ~/.vimrc << 'EOF'
" ========================================
" Vim配置文件
" ========================================

" 基础配置
syntax on                      " 语法高亮
set number                     " 显示行号
set relativenumber             " 相对行号
set cursorline                 " 高亮当前行
set showcmd                    " 显示命令
set ruler                      " 显示光标位置
set showmode                   " 显示模式

" 缩进配置
set tabstop=4                  " Tab宽度
set shiftwidth=4               " 自动缩进宽度
set expandtab                  " Tab转空格
set autoindent                 " 自动缩进
set smartindent                " 智能缩进

" 搜索配置
set hlsearch                   " 高亮搜索结果
set incsearch                  " 增量搜索
set ignorecase                 " 忽略大小写
set smartcase                  " 智能大小写

" 编辑增强
set mouse=a                    " 启用鼠标
set backspace=indent,eol,start " Backspace行为
set encoding=utf-8             " 编码
set fileencoding=utf-8         " 文件编码
set clipboard=unnamed          " 系统剪贴板

" 界面优化
set scrolloff=5                " 上下滚动保持5行
set showmatch                  " 显示匹配括号
set wildmenu                   " 命令补全菜单
set wildmode=longest:full,full " 补全模式
set laststatus=2               " 总是显示状态栏

" 性能优化
set lazyredraw                 " 宏执行时不重绘
set ttyfast                    " 快速终端连接

" 文件类型
filetype on                    " 检测文件类型
filetype plugin on             " 加载文件类型插件
filetype indent on             " 加载文件类型缩进

" 状态栏
set statusline=%F%m%r%h%w\ [%{&ff}]\ [%Y]\ [%04l,%04v][%p%%]\ [%L]

" 快捷键映射
" 按F2切换行号
nnoremap <F2> :set nonumber!<CR>:set norelativenumber!<CR>
" 按F3切换粘贴模式
set pastetoggle=<F3>
" 快速保存
nnoremap <C-s> :w<CR>
" 窗口切换
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l

" C/C++特定配置
autocmd FileType c,cpp setlocal commentstring=//\ %s
autocmd FileType c,cpp setlocal cindent

" Python特定配置
autocmd FileType python setlocal expandtab shiftwidth=4 softtabstop=4

" 自动删除行尾空格
autocmd BufWritePre * :%s/\s\+$//e
EOF
    
    print_info "Vim配置完成：~/.vimrc"
}

# 安装ARM交叉编译工具链
install_cross_compiler() {
    print_step "步骤4/7: 安装ARM交叉编译工具链"
    
    CROSS_PACKAGES=(
        gcc-arm-linux-gnueabihf
        g++-arm-linux-gnueabihf
        binutils-arm-linux-gnueabihf
        gcc-aarch64-linux-gnu
        g++-aarch64-linux-gnu
        binutils-aarch64-linux-gnu
    )
    
    print_info "安装ARM交叉编译工具..."
    $SUDO apt install -y "${CROSS_PACKAGES[@]}"
    
    print_info "交叉编译工具安装完成"
    echo ""
    echo "  ARM32: $(arm-linux-gnueabihf-gcc --version | head -n 1)"
    echo "  ARM64: $(aarch64-linux-gnu-gcc --version | head -n 1)"
    
    # 测试交叉编译
    print_info "测试交叉编译..."
    
    cat > /tmp/test_cross.c << 'EOF'
#include <stdio.h>
int main() {
    printf("Hello ARM!\n");
    return 0;
}
EOF
    
    # 编译ARM32
    if arm-linux-gnueabihf-gcc /tmp/test_cross.c -o /tmp/test_arm32; then
        print_info "ARM32编译测试通过: $(file /tmp/test_arm32 | cut -d: -f2-)"
    else
        print_error "ARM32编译测试失败"
    fi
    
    # 编译ARM64
    if aarch64-linux-gnu-gcc /tmp/test_cross.c -o /tmp/test_arm64; then
        print_info "ARM64编译测试通过: $(file /tmp/test_arm64 | cut -d: -f2-)"
    else
        print_error "ARM64编译测试失败"
    fi
    
    # 清理测试文件
    rm -f /tmp/test_cross.c /tmp/test_arm32 /tmp/test_arm64
}

# 安装内核开发工具
install_kernel_tools() {
    print_step "步骤5/7: 安装内核开发工具"
    
    KERNEL_PACKAGES=(
        linux-headers-$(uname -r)
        linux-source
        libncurses-dev
        flex
        bison
        libssl-dev
        libelf-dev
        bc
        kmod
        cpio
    )
    
    print_info "安装内核开发工具..."
    $SUDO apt install -y "${KERNEL_PACKAGES[@]}"
    
    print_info "内核工具安装完成"
    echo "  内核版本: $(uname -r)"
    echo "  内核头文件: /usr/src/linux-headers-$(uname -r)"
}

# 安装性能分析工具
install_perf_tools() {
    print_step "步骤6/7: 安装性能分析工具"
    
    print_info "安装性能分析工具..."
    
    # 安装perf
    if $SUDO apt install -y linux-tools-common linux-tools-$(uname -r) 2>/dev/null; then
        print_info "perf安装成功"
    else
        print_warning "perf安装失败（可能需要手动安装）"
    fi
    
    # 安装其他工具
    $SUDO apt install -y ltrace valgrind sysstat iotop iftop
    
    print_info "性能分析工具安装完成"
}

# 配置Git
configure_git() {
    print_step "步骤7/7: 配置Git"
    
    # 检查Git是否已配置
    if git config --global user.name &> /dev/null && git config --global user.email &> /dev/null; then
        print_info "Git已配置："
        echo "  用户名: $(git config --global user.name)"
        echo "  邮箱: $(git config --global user.email)"
        echo ""
        read -p "是否重新配置？(y/n): " -n 1 -r
        echo
        if [[ ! $REPLY =~ ^[Yy]$ ]]; then
            print_info "跳过Git配置"
            return
        fi
    fi
    
    # 配置用户名和邮箱
    read -p "请输入Git用户名: " git_name
    read -p "请输入Git邮箱: " git_email
    
    git config --global user.name "$git_name"
    git config --global user.email "$git_email"
    
    # 配置编辑器
    git config --global core.editor vim
    
    # 配置别名
    git config --global alias.st status
    git config --global alias.co checkout
    git config --global alias.br branch
    git config --global alias.ci commit
    git config --global alias.unstage 'reset HEAD --'
    git config --global alias.last 'log -1 HEAD'
    git config --global alias.visual 'log --oneline --graph --decorate --all'
    
    # 配置颜色
    git config --global color.ui auto
    
    print_info "Git配置完成"
    echo ""
    git config --global --list | grep "^user\|^core.editor\|^alias"
}

# 创建环境信息文件
create_env_info() {
    print_step "创建环境信息文件"
    
    INFO_FILE=~/environment_info.txt
    
    cat > $INFO_FILE << EOF
========================================
    Ubuntu开发环境信息
========================================

安装日期：$(date)
主机名：$(hostname)
用户：$(whoami)

【系统信息】
$(lsb_release -a 2>/dev/null)

内核版本：$(uname -r)
架构：$(uname -m)

【编译工具】
GCC: $(gcc --version | head -n 1)
G++: $(g++ --version | head -n 1)
Make: $(make --version | head -n 1)
CMake: $(cmake --version | head -n 1)

【交叉编译】
ARM32: $(arm-linux-gnueabihf-gcc --version | head -n 1)
ARM64: $(aarch64-linux-gnu-gcc --version | head -n 1)

【版本控制】
Git: $(git --version)
Git用户：$(git config --global user.name) <$(git config --global user.email)>

【Python】
Python3: $(python3 --version)
Pip3: $(pip3 --version 2>/dev/null || echo "未安装")

【磁盘使用】
$(df -h / | tail -n 1)

【内存信息】
$(free -h | grep "Mem:")

========================================
EOF
    
    print_info "环境信息已保存到：$INFO_FILE"
}

# 显示总结
show_summary() {
    echo ""
    print_step "安装完成总结"
    
    echo -e "${GREEN}✓${NC} SSH服务（需手动安装：sudo apt install openssh-server）"
    echo -e "${GREEN}✓${NC} 基础开发工具（gcc、g++、make、cmake、git等）"
    echo -e "${GREEN}✓${NC} 文本编辑器（vim已配置）"
    echo -e "${GREEN}✓${NC} ARM交叉编译工具链（ARM32、ARM64）"
    echo -e "${GREEN}✓${NC} 内核开发工具"
    echo -e "${GREEN}✓${NC} 性能分析工具"
    echo -e "${GREEN}✓${NC} Git配置"
    
    echo ""
    print_info "后续步骤："
    echo "  1. 配置SSH免密登录（在Windows端执行）"
    echo "  2. 配置Cursor Remote-SSH"
    echo "  3. （可选）安装CLion或VSCode"
    echo ""
    print_info "环境信息文件：~/environment_info.txt"
    print_info "Vim配置文件：~/.vimrc"
    echo ""
    print_info "测试编译："
    echo "  echo 'int main(){return 0;}' | gcc -x c - -o test && ./test && echo '编译成功！'"
    echo ""
    print_info "测试交叉编译："
    echo "  echo 'int main(){return 0;}' | arm-linux-gnueabihf-gcc -x c - -o test_arm && file test_arm"
    echo ""
}

# 主函数
main() {
    clear
    echo ""
    echo -e "${GREEN}========================================${NC}"
    echo -e "${GREEN}   Ubuntu开发环境自动安装脚本${NC}"
    echo -e "${GREEN}========================================${NC}"
    echo ""
    echo "此脚本将安装以下组件："
    echo "  - 基础开发工具（gcc、g++、make、cmake等）"
    echo "  - ARM交叉编译工具链"
    echo "  - 内核开发工具"
    echo "  - 性能分析工具"
    echo "  - 配置vim和Git"
    echo ""
    echo -e "${YELLOW}警告：此脚本需要sudo权限${NC}"
    echo ""
    read -p "是否继续？(y/n): " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        print_info "安装已取消"
        exit 0
    fi
    
    # 执行检查
    check_sudo
    check_ubuntu_version
    
    # 开始安装
    START_TIME=$(date +%s)
    
    update_package_list
    install_basic_tools
    configure_vim
    install_cross_compiler
    install_kernel_tools
    install_perf_tools
    configure_git
    create_env_info
    
    # 计算耗时
    END_TIME=$(date +%s)
    ELAPSED=$((END_TIME - START_TIME))
    
    # 显示总结
    show_summary
    
    echo ""
    print_info "总耗时：$((ELAPSED / 60))分$((ELAPSED % 60))秒"
    echo ""
    echo -e "${GREEN}========================================${NC}"
    echo -e "${GREEN}      环境安装全部完成！🎉${NC}"
    echo -e "${GREEN}========================================${NC}"
    echo ""
}

# 运行主函数
main

